<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //闭包保护:私有变量和外部变量没有必然关系
        (function (global, factory) {
            factory(global) //funciton(window)
        })(typeof window !== "undefined" ? window : this, function (window, noGlobal) {
            var jQuery = function () { }
            window.jQuery = window.$ = jQuery//通过给全局对象添加属性:jQuery/$ 把私有的jQuery方法暴露到全局下,供外面使用

        })
        //typeof window !== "undefined" ? window : this 验证当前所处环境的全局对象是window还是global
        //factory=funciton(){}
        jQuery()
        $()


        //真实项目，一般需要把自己写的内容放到一个闭包中，可以有效防止自己的代码和别人代码产生冲突
        //真实项目，尽可能减少对全局变量的使用，如果哦需要把自己的东西给别人用，基于return和window.xxx等方式暴露
        //真实项目，真实项目中应该减少对闭包的使用(因为闭包会产生不释放的栈内存，可能导致内存溢出)



        //原生js
        var xxx = (function () {
            //写的代码
            return xxx
        })();

        (function () {
            //写的代码
            window.xxx = xxx
        })()

        //jQ
        $(function () {
            //这样写在某些角度上也是为了减少全局变量
        })
    </script>
</body>

</html>